Un module désigne originellement un fichier de code de programmation ou un fichier de bibliothèque statique ou dynamique.
Pour reprendre l'image de la programmation objet, un module est une instance unique qui n'utilise pas d'héritage et ne contient aucun module fils. Chaque module peut exporter ou importer certains symboles comme des variables, des fonctions ou des classes. Les modules peuvent se regrouper en package (espace de noms) éventuellement hiérarchique.
Dans l'histoire de la programmation, la programmation modulaire succède à la programmation procédurale et donnera naissance à la programmation orientée objet.
Quand on parle de programmation modulaire on parle du C qui a utilisé, en premier lieu, ce principe pour scinder la compilation de projet. Dans ce cas, un module est identifié par un fichier de déclaration (en-têtes ou prototypes) et un fichier de description (définition ou code). On n'est plus obligé de recompiler l'ensemble d'un programme lorsque seuls quelques modules sont modifiés. Les fonctions et variables déclarées dans le fichier de déclaration sont publiques et peuvent être utilisées par n'importe quel autre module, il s'agit de l'interface du module[1]. Les fonctions et variables déclarées dans le fichier de description sont privées et ne peuvent être utilisées que par ce module particulier.
En Java, on n'utilise généralement pas le terme de module, mais certains compilateurs permettent de déclarer plusieurs classes successives (sans imbrication) dans un même fichier. On peut alors considérer un fichier de code Java comme un module contenant un ensemble de classes.
En Python, chaque fichier peut être considéré comme un module à partir du moment où le fichier l'important se trouve dans le même répertoire que le module, autrement il sera impossible de l'importer.
Les langages Modula et Ada sont typiquement modulaires avec des instructions pour la gestion des modules. Le langage C/C++ est modulaire mais les instructions pour la gestion des modules se retrouvent dans un langage de prétraitement (dédié au préprocesseur). Le langage Objective Caml, qui repose essentiellement sur la programmation fonctionnelle et modulaire, propose un système de modules récursifs et paramétrables très puissant qui permet de fournir une grande généricité au code.